using System;
using System.Collections.Generic;
using System.Text;
using Entidades;
using DataAccessArquitectura;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

/*
 * Nombre archivo: empresaBuilder.cs 
 *
 * Descripcion: Manipulacion de la tabla empresa, con los metodos de consulta, grabado, actulaizacion
 * y recuperacion de un registro
 *
 * Autor: PLUS-EW
 * Fecha: 31/08/2011 23:37:44
 *
 * Historial
 * ---------------------------------------------------------
 * Autor            Fecha               Modificación
 *
 */

namespace Reglas_Negocio
{
	public class empresaBuilder
	{
		private const enmTipoBaseDatos mTipoBD = enmTipoBaseDatos.MySQL;

		#region < METODOS PUBLICOS CONSULTA >
		public static DataTable ListarTodos()
		{
			try
			{
				return ListarTodos("");
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static DataTable ListarTodos(string filtro)
		{
			DataTable r = new DataTable();
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				r = bd.EjecutarSelectDs("*", "empresa", filtro).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		public static bool Existe(string filtro)
		{
			int numero = 0;
			bool r = false;
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				numero = Convert.ToInt32(bd.EjecutarSelectScalar("COUNT(*)", "empresa", filtro));
				r = (numero > 0);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		#endregion

		#region < METODOS PUBLICOS GRABADO >
		public static bool GrabarViaProcedimiento(empresa datos)
		{
			int numero = 0;
			bool r = false;
			string filtro = "";
			try
			{
				string strConectionInsert = "INSERT INTO empresa (ruc_empr,nombre_empr,direccion_empr,telefono_empr,email_empr,encargado_empr,logo_empr,ciudad_empr,tipo_empr) VALUES (?ruc_empr,?nombre_empr,?direccion_empr,?telefono_empr,?email_empr,?encargado_empr,?logo_empr,?ciudad_empr,?tipo_empr);";
                string strConectionUpdate = "UPDATE empresa SET ruc_empr = ?ruc_empr,nombre_empr = ?nombre_empr,direccion_empr = ?direccion_empr,telefono_empr = ?telefono_empr,email_empr = ?email_empr,encargado_empr = ?encargado_empr,logo_empr = ?logo_empr,ciudad_empr = ?ciudad_empr,tipo_empr = ?tipo_empr WHERE id_empr=?id_empr OR (ruc_empr = ?ruc_empr AND tipo_empr = ?tipo_empr);";

				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				MySqlParameter psqlId_empr = new MySqlParameter("?id_empr", MySqlDbType.Int32);
				MySqlParameter psqlRuc_empr = new MySqlParameter("?ruc_empr", MySqlDbType.VarChar,20);
				MySqlParameter psqlNombre_empr = new MySqlParameter("?nombre_empr", MySqlDbType.VarChar,100);
				MySqlParameter psqlDireccion_empr = new MySqlParameter("?direccion_empr", MySqlDbType.VarChar);
				MySqlParameter psqlTelefono_empr = new MySqlParameter("?telefono_empr", MySqlDbType.VarChar,100);
				MySqlParameter psqlEmail_empr = new MySqlParameter("?email_empr", MySqlDbType.VarChar,100);
				MySqlParameter psqlEncargado_empr = new MySqlParameter("?encargado_empr", MySqlDbType.VarChar,150);
				MySqlParameter psqlLogo_empr = new MySqlParameter("?logo_empr", MySqlDbType.LongBlob);
				MySqlParameter psqlCiudad_empr = new MySqlParameter("?ciudad_empr", MySqlDbType.VarChar,50);
				MySqlParameter psqlTipo_empr = new MySqlParameter("?tipo_empr", MySqlDbType.VarChar,50);

				psqlId_empr.Value = datos.Id_empr;
				psqlRuc_empr.Value = datos.Ruc_empr;
				psqlNombre_empr.Value = datos.Nombre_empr;
				psqlDireccion_empr.Value = datos.Direccion_empr;
				psqlTelefono_empr.Value = datos.Telefono_empr;
				psqlEmail_empr.Value = datos.Email_empr;
				psqlEncargado_empr.Value = datos.Encargado_empr;
				psqlLogo_empr.Value = datos.Logo_empr;
				psqlCiudad_empr.Value = datos.Ciudad_empr;
				psqlTipo_empr.Value = datos.Tipo_empr;

                filtro = string.Format("id_empr= '{0}' OR (ruc_empr = '{1}' AND tipo_empr = '{2}' )", datos.Id_empr, datos.Ruc_empr,datos.Tipo_empr);

				if (!Existe(filtro))
				{
					numero = bd.EjecutarProcedimientoMySQL(strConectionInsert
							, psqlId_empr
							, psqlRuc_empr
							, psqlNombre_empr
							, psqlDireccion_empr
							, psqlTelefono_empr
							, psqlEmail_empr
							, psqlEncargado_empr
							, psqlLogo_empr
							, psqlCiudad_empr
							, psqlTipo_empr
							);
					MessageBox.Show("Se grabo [empresa] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				else
				{
					numero = bd.EjecutarProcedimientoMySQL(strConectionUpdate
							, psqlId_empr
							, psqlRuc_empr
							, psqlNombre_empr
							, psqlDireccion_empr
							, psqlTelefono_empr
							, psqlEmail_empr
							, psqlEncargado_empr
							, psqlLogo_empr
							, psqlCiudad_empr
							, psqlTipo_empr
							);
					MessageBox.Show("Se actualizó [empresa] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				r = (numero < 0);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static void GrabarViaSql(empresa datos)
		{
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
                string filtro = string.Format("id_empr= '{0}' OR (ruc_empr = '{1}' AND tipo_empr = '{2}' )", datos.Id_empr, datos.Ruc_empr, datos.Tipo_empr);

				if (!Existe(filtro))
				{
					bd.EjecutarInsert("empresa"
						, new CampoValor("ruc_empr", datos.Ruc_empr)
						, new CampoValor("nombre_empr", datos.Nombre_empr)
						, new CampoValor("direccion_empr", datos.Direccion_empr)
						, new CampoValor("telefono_empr", datos.Telefono_empr)
						, new CampoValor("email_empr", datos.Email_empr)
						, new CampoValor("encargado_empr", datos.Encargado_empr)
						, new CampoValor("ciudad_empr", datos.Ciudad_empr)
						, new CampoValor("tipo_empr", datos.Tipo_empr)
						);
					MessageBox.Show("Se grabo [empresa] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				else
				{
					bd.EjecutarUpdate("empresa", filtro
						, new CampoValor("ruc_empr", datos.Ruc_empr)
						, new CampoValor("nombre_empr", datos.Nombre_empr)
						, new CampoValor("direccion_empr", datos.Direccion_empr)
						, new CampoValor("telefono_empr", datos.Telefono_empr)
						, new CampoValor("email_empr", datos.Email_empr)
						, new CampoValor("encargado_empr", datos.Encargado_empr)
						, new CampoValor("ciudad_empr", datos.Ciudad_empr)
						, new CampoValor("tipo_empr", datos.Tipo_empr)
						);
					MessageBox.Show("Se actualizó [empresa] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		#region < METODOS PUBLICOS RECUPERACION >
		public static empresa Recuperar(string filtro)
		{
			empresa r = new empresa();
			try
			{
				if (Existe(filtro))
				{
					DataTable ds = ListarTodos(filtro);
					r.Id_empr = Convert.ToInt32(ds.Rows[0]["id_empr"]);
					if (ds.Rows[0]["ruc_empr"] != System.DBNull.Value)
						r.Ruc_empr = ds.Rows[0]["ruc_empr"].ToString();
					if (ds.Rows[0]["ruc_empr"] == System.DBNull.Value)
						r.Ruc_empr = "";
					if (ds.Rows[0]["nombre_empr"] != System.DBNull.Value)
						r.Nombre_empr = ds.Rows[0]["nombre_empr"].ToString();
					if (ds.Rows[0]["nombre_empr"] == System.DBNull.Value)
						r.Nombre_empr = "";
					if (ds.Rows[0]["direccion_empr"] != System.DBNull.Value)
						r.Direccion_empr = ds.Rows[0]["direccion_empr"].ToString();
					if (ds.Rows[0]["direccion_empr"] == System.DBNull.Value)
						r.Direccion_empr = "";
					if (ds.Rows[0]["telefono_empr"] != System.DBNull.Value)
						r.Telefono_empr = ds.Rows[0]["telefono_empr"].ToString();
					if (ds.Rows[0]["telefono_empr"] == System.DBNull.Value)
						r.Telefono_empr = "";
					if (ds.Rows[0]["email_empr"] != System.DBNull.Value)
						r.Email_empr = ds.Rows[0]["email_empr"].ToString();
					if (ds.Rows[0]["email_empr"] == System.DBNull.Value)
						r.Email_empr = "";
					if (ds.Rows[0]["encargado_empr"] != System.DBNull.Value)
						r.Encargado_empr = ds.Rows[0]["encargado_empr"].ToString();
					if (ds.Rows[0]["encargado_empr"] == System.DBNull.Value)
						r.Encargado_empr = "";
					if (ds.Rows[0]["logo_empr"] != System.DBNull.Value)
						r.Logo_empr = (byte[])ds.Rows[0]["logo_empr"];
					if (ds.Rows[0]["logo_empr"] == System.DBNull.Value)
						r.Logo_empr = null;
					if (ds.Rows[0]["ciudad_empr"] != System.DBNull.Value)
						r.Ciudad_empr = ds.Rows[0]["ciudad_empr"].ToString();
					if (ds.Rows[0]["ciudad_empr"] == System.DBNull.Value)
						r.Ciudad_empr = "";
					if (ds.Rows[0]["tipo_empr"] != System.DBNull.Value)
						r.Tipo_empr = ds.Rows[0]["tipo_empr"].ToString();
					if (ds.Rows[0]["tipo_empr"] == System.DBNull.Value)
						r.Tipo_empr = "";
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		#endregion

		#region < METODOS PUBLICOS BORRADO >
		public static void Borrar(string filtro)
		{
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				bd.EjecutarDelete("empresa", filtro);
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static void BorrarTodos()
		{
			try
			{
				Borrar("");
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		#region < METODOS PUBLICOS EXTRAS >
		public static void Listar_Combobox(ComboBox cmbempresa, string filtro, string nombre_display)
		{
			cmbempresa.DataSource = ListarTodos(filtro);
			cmbempresa.DisplayMember = nombre_display;
			cmbempresa.ValueMember = "id_empr";
		}

        public static void Listar_Combobox(ComboBox cmbempresa, string nombre_display)
        {
            cmbempresa.DataSource = ListarTodos_Alias_Combobox("");
            cmbempresa.DisplayMember = nombre_display;
            cmbempresa.ValueMember = "id_empr";
        }

        public static DataTable ListarTodos_Alias_Combobox(string filtro)
        {
            DataTable r = new DataTable();
            try
            {
                ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
                r = bd.EjecutarSelectDs("id_empr AS id_empr,ruc_empr AS RUC,CONCAT(nombre_empr,' | ',tipo_empr) AS nombre,direccion_empr AS DIRECCION,telefono_empr AS TELEFONO,email_empr AS \"E-MAIL\",encargado_empr AS \"REPRESENTANTE(E)\",logo_empr AS LOGO,ciudad_empr AS CIUDAD,tipo_empr AS TIPO", "empresa", filtro).Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return r;
        }

		public static DataTable ListarTodos_Alias(string filtro)
		{
			DataTable r = new DataTable();
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				r = bd.EjecutarSelectDs("id_empr AS REFERENCIA,ruc_empr AS RUC,nombre_empr AS NOMBRE,direccion_empr AS DIRECCION,telefono_empr AS TELEFONO,email_empr AS \"E-MAIL\",encargado_empr AS \"REPRESENTANTE(E)\",logo_empr AS LOGO,ciudad_empr AS CIUDAD,tipo_empr AS TIPO", "empresa", filtro).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static List<empresa> ListarTodos_List(string filtro)
		{
			List<empresa> r = new List<empresa>();
			try
			{
				DataTable dt = ListarTodos(filtro);
				for (int i = 0; i < dt.Rows.Count; i++)
					r.Add(Recuperar("id_empr="+dt.Rows[i]["id_empr"]));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		#endregion

		#region < METODOS PUBLICOS VALIDACION >
		public static empresa valida_campos_empresa(Control ctrl_id_empr,TextBox txt_ruc_empr,TextBox txt_nombre_empr,TextBox txt_direccion_empr,TextBox txt_telefono_empr,TextBox txt_email_empr,TextBox txt_encargado_empr,byte[] bin_logo_empr,TextBox txt_ciudad_empr,TextBox txt_tipo_empr)
		{
			bool r = true;
			empresa new_empresa = new empresa();
			try
			{
				if(ctrl_id_empr.GetType().Equals(typeof(TextBox)))
				{
					TextBox txt_id_empr = (TextBox)ctrl_id_empr;
					if (txt_id_empr.TextLength == 0)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					else
					{
						if (Convert.ToInt32(txt_id_empr.Text) == 0)
						{
							r = false;
							MessageBox.Show("Falta ingresar el/la id_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
						}
					}
					if (r)
						new_empresa.Id_empr = Convert.ToInt32(txt_id_empr.Text);
				}
				if(ctrl_id_empr.GetType().Equals(typeof(ComboBox)))
				{
					ComboBox cmb_id_empr = (ComboBox)ctrl_id_empr;
					if (cmb_id_empr.SelectedIndex == -1)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					if (r)
						new_empresa.Id_empr = Convert.ToInt32(cmb_id_empr.SelectedValue);
				}
				if (txt_ruc_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la ruc_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Ruc_empr = txt_ruc_empr.Text;
				if (txt_nombre_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la nombre_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Nombre_empr = txt_nombre_empr.Text;
				if (txt_direccion_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la direccion_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Direccion_empr = txt_direccion_empr.Text;
				if (txt_telefono_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la telefono_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Telefono_empr = txt_telefono_empr.Text;
				if (txt_email_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la email_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Email_empr = txt_email_empr.Text;
				if (txt_encargado_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la encargado_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Encargado_empr = txt_encargado_empr.Text;
				if (r)
					new_empresa.Logo_empr = bin_logo_empr;
				if (txt_ciudad_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la ciudad_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Ciudad_empr = txt_ciudad_empr.Text;
				if (txt_tipo_empr.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la tipo_empr","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_empresa.Tipo_empr = txt_tipo_empr.Text;

				if(!r)
					new_empresa = null;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return new_empresa;
		}

        public static empresa valida_campos_empresa_personaliza(Control ctrl_id_empr, TextBox txt_ruc_empr, TextBox txt_nombre_empr, TextBox txt_direccion_empr, TextBox txt_telefono_empr, TextBox txt_email_empr, TextBox txt_encargado_empr, byte[] bin_logo_empr, TextBox txt_ciudad_empr, string txt_tipo_empr)
        {
            bool r = true;
            empresa new_empresa = new empresa();
            try
            {
                if (ctrl_id_empr.GetType().Equals(typeof(TextBox)))
                {
                    TextBox txt_id_empr = (TextBox)ctrl_id_empr;
                    new_empresa.Id_empr = Convert.ToInt32(txt_id_empr.Text);
                }
                
                if (txt_ruc_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la ruc_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Ruc_empr = txt_ruc_empr.Text;
                if (txt_nombre_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la nombre_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Nombre_empr = txt_nombre_empr.Text;
                if (txt_direccion_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la direccion_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Direccion_empr = txt_direccion_empr.Text;
                if (txt_telefono_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la telefono_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Telefono_empr = txt_telefono_empr.Text;
                
                if (r)
                    new_empresa.Email_empr = txt_email_empr.Text;
                if (txt_encargado_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la encargado_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Encargado_empr = txt_encargado_empr.Text;
                if (r)
                    new_empresa.Logo_empr = bin_logo_empr;
                if (txt_ciudad_empr.TextLength == 0)
                {
                    r = false;
                    MessageBox.Show("Falta ingresar el/la ciudad_empr", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                if (r)
                    new_empresa.Ciudad_empr = txt_ciudad_empr.Text;
               
                if (r)
                    new_empresa.Tipo_empr = txt_tipo_empr;

                if (!r)
                    new_empresa = null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return new_empresa;
        }

		public static bool grabar_actualizar_registro(Control ctrl_id_empr,TextBox txt_ruc_empr,TextBox txt_nombre_empr,TextBox txt_direccion_empr,TextBox txt_telefono_empr,TextBox txt_email_empr,TextBox txt_encargado_empr,PictureBox bin_logo_empr,TextBox txt_ciudad_empr,string txt_tipo_empr)
		{
            bool r = false;
            try
            {
                //empresa new_empresa =valida_campos_empresa(ctrl_id_empr,txt_ruc_empr,txt_nombre_empr,txt_direccion_empr,txt_telefono_empr,txt_email_empr,txt_encargado_empr,bin_logo_empr,txt_ciudad_empr,txt_tipo_empr); 
                byte[] big_em = null;

                if (bin_logo_empr.BackgroundImage != null)
                {
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    bin_logo_empr.BackgroundImage.Save(ms, bin_logo_empr.BackgroundImage.RawFormat);
                    big_em = ms.GetBuffer();
                }

                empresa new_empresa = valida_campos_empresa_personaliza(ctrl_id_empr, txt_ruc_empr, txt_nombre_empr, txt_direccion_empr, txt_telefono_empr, txt_email_empr, txt_encargado_empr, big_em, txt_ciudad_empr, txt_tipo_empr);
                if (new_empresa != null)
                {
                    GrabarViaProcedimiento(new_empresa);
                    r = true;
                }
                else
                    r = false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return r;
		}

		#endregion

	}
}
